﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bukstor.Biz;

namespace Bukstor.Admin.UI.Utilidades
{
    public static class ReglasInventario
    {
        static BukstorBDEntities Entidades;

        static ReglasInventario()
        {
            Entidades = new BukstorBDEntities();
        }

        public static void EjecutarReglasDeActualización()
        {
            bool agregoStock;
            do
            {
                agregoStock = false;
                #region Eliminar reservas vencida
                IEnumerable<Reserva> reservasVencidas = from Reserva R in Entidades.Reservas
                                                        where !R.ingresoInventario
                                                        select R;
                foreach (Reserva R in reservasVencidas)
                {
                    if((DateTime.Today - R.fecha).Days > 30)
                    Entidades.DeleteObject(R);
                }
                Entidades.SaveChanges();
                #endregion

                #region Eliminar y reintegrar stock de reservas no reclamadas
                IEnumerable<Reserva> reservasNoReclamadas = from Reserva R in Entidades.Reservas
                                                            where R.ingresoInventario 
                                                            select R;
                foreach (Reserva R in reservasNoReclamadas)
                {
                    if ((DateTime.Today - (DateTime)R.fechaIngresoInventario).Days > 7)
                    {
                        if (!R.LibroReference.IsLoaded) R.LibroReference.Load();
                        if (!R.Libro.InventarioReference.IsLoaded) R.Libro.InventarioReference.Load();
                        R.Libro.Inventario.cantidad += R.cantidad;
                        Entidades.DeleteObject(R);
                        agregoStock = true;
                    }
                }
                Entidades.SaveChanges();
                #endregion

                #region Utilizar nuevo stock para honrar reservas vigentes
                IEnumerable<Reserva> reservasVigentes = from Reserva R in Entidades.Reservas
                                                        where !R.ingresoInventario &&
                                                            R.Libro.Inventario.cantidad >= R.cantidad
                                                            orderby R.fecha
                                                        select R;
                foreach (Reserva R in reservasVigentes)
                {
                    if (!R.LibroReference.IsLoaded) R.LibroReference.Load();
                    if (!R.Libro.InventarioReference.IsLoaded) R.Libro.InventarioReference.Load();
                    if (R.Libro.Inventario.cantidad >= R.cantidad)
                    {
                        R.Libro.Inventario.cantidad -= R.cantidad;
                        R.ingresoInventario = true;
                        R.fechaIngresoInventario = DateTime.Today;
                        // Enviar e-mail al cliente (requiere SMTP)
                    }
                }
                Entidades.SaveChanges();
                #endregion

            } while (agregoStock);
        }
    }
}